/*********************************************************
 * 初学之家(http://www.g2room.com)，提供Java、Javascript（js）、Jquery、
 * 等一些工具或常用功能的实现例子代码，希望能给初学者提供学习和工作上的帮助，
 * 也希望有想提供源代码的朋友能联系我，一起努力，提供更多、更全面、更详细的
 * 一些初学代码例子及经验，帮助更多的人。
 * 
 * 我的联系方式：E-Mail：g2room@163.com
 * 网址：http://www.g2room.com
 * QQ：天涯（1173930590）
 * QQ交流群：323642758
 * 
 * 本站内容为提供各种java、javascript(JS)常用的工具源代码、实例（示例）、
 * 基本配置、教程、手册等；目前Java代码提供的工具（或转换）例子代码如下：
 * BASE64转换工具、bytes相关操作、email收发、文件操作（读写、拷贝、遍历、
 * 多线程copy等）、json格式转换、日志（Log4j）操作工具、Lucene搜索引擎的
 * 创建索引和搜索、各种不同Map的使用、定时器（Quartz）的使用例子、Socket的
 * 连接传输数据例子、WebService的例子及一些常用的工具类如String、Date及
 * JDK自带的一些工具类及函数的使用例子。
 * 
 * 说明：如需直接使用本站的例子代码，请保留此说明
 * 
 ********************************************************/
package com.g2room.io.stream;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * 
 *
 * @createTime: Nov 28, 2013 9:33:44 PM
 * @author: <a href="mailto:g2room@163.com">天涯</a>
 * @version: 0.1
 * @lastVersion: 0.1
 * @updateTime: 
 * @updateAuthor: <a href="mailto:g2room@163.com">天涯</a>
 * @changesSum: 
 * 
 */
public class StreamOp {

	public final static String filePath = "E:/var/test/file/streamTest.txt";
	public static void main(String[] args) {
		String charEncode = "UTF-16";
		String text = "王问相如曰：“子好色乎？”相如曰：“臣不好色也。”王曰：“子不好色，何若孔墨乎？”相如曰：“古之避色，孔墨之徒，闻齐馈女而遐逝[5]，望朝歌而回车[6]，譬犹防火水中，避溺山隅，此乃未见其可欲，何以明不好色乎？若臣者，少长西土，鳏处独居，室宇辽廓[7]，莫与为娱。臣之东邻，有一女子，云发丰艳，蛾眉皓齿，颜盛色茂，景曜光起。恒翘翘而西顾[8]，欲留臣而共止。登垣而望臣，三年于兹矣，臣弃而不许。"
			+ "\r\t\n"
			+"“窃慕大王之高义，命驾东来，途出郑卫[9]，道由桑中。朝发溱洧[10]，暮宿上宫[11]。上宫闲馆，寂寞云虚[12]，门阁昼掩，暧若神居[13]。臣排其户而造其室，芳香芬烈，黼帐高张[14]。有女独处，婉然在床。奇葩逸丽，淑质艳光。睹臣迁延[15]，微笑而言曰：‘上客何国之公子！所从来无乃远乎？’遂设旨酒，进鸣琴。臣遂抚琴，为幽兰白雪之曲。女乃歌曰：‘独处室兮廓无依[16]，思佳人兮情伤悲！有美人兮来何迟，日既暮兮华色衰，敢托身兮长自思。’玉钗挂臣冠，罗袖拂臣衣。时日西夕，玄阴晦冥[17]，流风惨冽，素雪飘零，闲房寂谧[18]，不闻人声。于是寝具既陈，服玩珍奇，金鉔薰香[19]，黼帐低垂，裀褥重陈，角枕横施。女乃驰其上服，表其亵衣[20]。皓体呈露，弱骨丰肌。时来亲臣，柔滑如脂。臣乃脉定于内[21]，心正于怀，信誓旦旦，秉志不回[22]。翻然高举，与彼长辞。”";
//		output(text);
//		input();
//		copyFile("E:/var/test/file/tax.jpg", "E:/var/test/file/q.jpg");
//		switchInputStream("GBK");
		switchOutputStream(text, charEncode);
	}
	
	public static void output(String text) {
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(filePath);
			
			byte[] bytes = text.getBytes();
			System.out.println(new String(bytes));
			fos.write(bytes);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(null != fos) fos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public static void input() {
		//  BufferedInputStream使用和这个差不多
		FileInputStream fis = null;
		try {
			// 默认编码
			fis = new FileInputStream(filePath);
//			// 获取文件长度，一次性读取出来
//			// 文件过大会内存溢出
//			byte[] bytes = new byte[fis.available()];
//			System.out.println("读取之前内容：" + new String(bytes));
//			fis.read(bytes);
//			System.out.println("读取之后内容：" + new String(bytes));
			
			// 使用缓冲区的方式
			// 中文时，可能会出现因为字节截断的乱码
			byte[] buff = new byte[12];
			while (fis.read(buff) != -1) {
				System.out.println("读取的内容：" + new String(buff));
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(null != fis) fis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 拷贝source文件为target文件
	 *
	 * @param sourth
	 * @param target
	 * @auther <a href="mailto:g2room@163.com">天涯</a>
	 * Nov 28, 2013 10:01:59 PM
	 */
	public static void copyFile(String sourth, String target) {
		FileInputStream fis = null;
		FileOutputStream fos = null;
		try {
			fis = new FileInputStream(sourth);
			fos = new FileOutputStream(target);
			byte[] buff = new byte[1024];
			while (fis.read(buff) != -1) {
				fos.write(buff);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if(null != fis) fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if(null != fos) fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void switchOutputStream(String text, String charEncode) {
		FileOutputStream fos = null;
		OutputStreamWriter osr = null;
		try {
			// 默认编码方式
			fos = new FileOutputStream(filePath);
			// 指定编码方式，此处如为非原编码方式则输出乱码
			osr = new OutputStreamWriter(fos, charEncode);
			int buffLen = 12;
			char[] buff = new char[buffLen];
			int len = 0;
			int endLen = 0;
			while(len < text.length()) {
				if(len + buffLen > text.length()) {
					// 读取最后几个字符的特殊处理
					// 长度，不能数组越界
					endLen = text.length();
					// 设置读取数组长度为实际长度，因为此时可能字符不足12个
					buff = new char[endLen - len];
				} else {
					endLen = len + buffLen;
				}
				text.getChars(len, endLen, buff, 0);
				osr.write(buff);
				len = endLen;
			}
			osr.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(null != osr) osr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if(null != fos) fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void switchInputStream(String charEncode) {
		FileInputStream fis = null;
		InputStreamReader isr = null;
		try {
			// 默认编码方式
			fis = new FileInputStream(filePath);
//			// 不指定编码方式，效果同上
//			InputStreamReader isr = new InputStreamReader(fis);
			// 指定编码方式，此处如为非原编码方式则输出乱码
			isr = new InputStreamReader(fis, charEncode);
			char[] buff = new char[1024];
			while(isr.read(buff) != -1) {
				System.out.println(buff);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(null != isr) isr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if(null != fis) fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
